import layout from '@/layout/index.vue'

// 角色验证（item 为路由节点对象）
function authRoles(item, userRoles, considerShowFirstChild = true) {
  if (!userRoles) {
    return false
  }
  if (item.meta.roles === undefined) {
    // roles 数组没有声明，允许任何角色进行访问
    return true
  } else {
    // roles 数组为空数组，禁止任何角色进行访问
    if (item.meta.roles.length === 0) {
      return false
    } else {
      // rolse 数组有值，则进行验证用户角色
      if (auth(item.meta.roles, userRoles)) {
        if (item.meta.showFirstChild && considerShowFirstChild) {
          // 具有 showFirstChild 的父菜单需要继续往下验证第一个子菜单（递归）
          return authRoles(item.children[0], userRoles)
        } else {
          return true
        }
      } else {
        return false
      }
    }
  }
}

// 路由守卫验证（item 为路由守卫的 to/from 对象，与路由节点对象有少许区别）
function authGuard(item, userRoles) {
  return authRoles(item, userRoles, false)
}

// routeRoles 是否含有 userRoles
function auth(routeRoles, userRoles) {
  if (routeRoles && userRoles) {
    for (let i=0; i<userRoles.length; i++) {
      if (routeRoles.includes(userRoles[i])) {
        return true
      }
    }
  }
  return false
}

// 将路由树添加到路由上
function authRoutes(routes, router) {
  // router.options.routes = router.options.routes.concat(routes)
  // 必须深拷贝 routes，防止改变 userStore.dynamicRoutes 的 component
  // userStore.dynamicRoutes 的 component 数据必须是字符串形式，每次取出来都要进行 resolveComponent 操作
  const temp = JSON.parse(JSON.stringify(routes))
  temp.forEach(item => {
    if (typeof item.component === 'string') {
      resolveComponent(item)
    }
    router.addRoute(item)
  })
}

const views = import.meta.globEager('@/views/**/*.vue', { import: 'default' })
function resolveComponent(item) {
  // 根据后端返回的数值判断进行动态加载哪个组件
  if (item.component) {
    if (item.component === 'layout') {
      item.component = layout
    } else {
      if (item.component.startsWith('/')) {
        item.component = views[`/src/views${item.component}.vue`]
      } else {
        item.component = views[`/src/views/${item.component}.vue`]
        if (item.component) {
          throw new Error('component:' + item.component)
        }
      }
    }
  }
  if (item.children && item.children.length > 0) {
    item.children.forEach(child => {
      resolveComponent(child)
    })
  }
}

// 删除动态路由（静态路由不会被删除）
function removeAuthRoutes(routes, router) {
  routes.forEach(item => {
    if (item.name && router.hasRoute(item.name)) {
      router.removeRoute(item.name)
    }
  })
}

export {
  authRoles,
  authGuard,
  authRoutes,
  removeAuthRoutes
}